# 在访问私有属性时，通常是用两个方法（set、get）方法进行属性的访问及修改。在使用过程中，是通过调用方法的方式进行操作属性。
# 可以使用property属性函数，进行控制，让用户在调用时，是以属性的方式访问，且又能够对私有属性进行保护
class Person:
    def __init__(self):
        self.__age=19
        pass
    def set_age(self,age):
        self.__age=age
        pass
    def get_age(self):
        return self.__age
    # 实现方式一：
    # 定义一个属性，当对这个age属性值进行修改时，默认调用set_age
    # 当获取age属性值，默认调用get_age方法
    # 注意：必须是以set、get开头的方法名，才能被调用
    age=property(get_age,set_age)

xm=Person()
print(xm.age)
xm.age=22
print(xm.age)

# 第二种实现方式：装饰器
class Animals:
    def __init__(self):
        self.__age=4
        pass
    @property   #使用装饰器property对age进行装饰，提供一个getter方法
    def age(self):
        return self.__age
    @age.setter   #使用装饰器进行装饰，提供一个setter方法
    def age(self,age):
        self.__age=age
        pass
    pass
dog=Animals()
print(dog.age)
dog.age=5
print(dog.age)

# 总结
# 使用装饰器@property实现的时候，方法名与私有化属性名保持一致
# getter方法与setter方法名保持一致
# 在getter方法的上面加上装饰器@property，在setter方法名上面加上装饰器：getter方法名.setter
# getter方法要在setter方法前面被声明